/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Clases;

/**
 *
 * @author Nerea
 */
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import javax.swing.JOptionPane;
public class Clinic {
    private ArrayList<Paciente> listaPac;
    private ArrayList<Medico> listaMed;
    private ArrayList<Cita> listaCita;
    private ArrayList<Historial> listaHist;
    
    public Clinic(){
        listaPac = new ArrayList<Paciente>();
        listaMed= new ArrayList<Medico>();
        listaHist= new ArrayList<Historial>();
        Medico a = new Medico("Pepe Flores",1);
        listaMed.add(a);
        Medico b = new Medico("Maria Luisa Fernández",2);
        listaMed.add(b);
        Medico c = new Medico("Antonio Alcántara",3);
        listaMed.add(c);
        Medico d = new Medico("Gregory House",4);
        listaMed.add(d);
        listaCita=new ArrayList<Cita>();
    }

    public ArrayList<Cita> getListaCita() {
        return listaCita;
    }

    public void setListaCita(ArrayList<Cita> listaCita) {
        this.listaCita = listaCita;
    }

    public ArrayList<Medico> getListaMed() {
        return listaMed;
    }

    public void setListaMed(ArrayList<Medico> listaMed) {
        this.listaMed = listaMed;
    }
    
    public ArrayList<Paciente> getLista() {
        return this.listaPac;
    }
    public void setLista(ArrayList<Paciente> pct) {
        this.listaPac = pct;
    }

    public ArrayList<Historial> getListaHist() {
        return listaHist;
    }

    public void setListaHist(ArrayList<Historial> listaHist) {
        this.listaHist = listaHist;
    }
    
    public void anyadir(Paciente p){
         listaPac.add(p);
         Historial h = new Historial(p.getNombre(),p.getApellidos());
         listaHist.add(h);
    }
    public void anyadir(String n,String ape,String tl, String dir,String med,int sala) {
        int id =0;
        int aux=0;
        String iden="";
        Paciente p = new Paciente();
        if(listaPac.isEmpty()){
            id=1;
            iden=id+"";
        }else{
            aux=listaPac.size()-1;
            p = listaPac.get(aux);
            aux=Integer.parseInt(p.getId());
            aux=aux+1;
            iden=aux+"";
        }
        Paciente q = new Paciente(n,ape,tl,iden,dir,med,sala);
        listaPac.add(q);
        Historial h = new Historial(n,ape);
        listaHist.add(h);
        
        JOptionPane.showMessageDialog(null, "Paciente añadido correctamente", "Paciente añadido", JOptionPane.INFORMATION_MESSAGE);
    }
    public Paciente mostrarPac(String nomb,String apellido){
        boolean control=false;
        Iterator i = listaPac.iterator();
        Paciente cont = new Paciente();        
         while(i.hasNext()&& control==false){
            Paciente aux = (Paciente) i.next();
            if ((aux.getNombre().equals(nomb)) && (aux.getApellidos().equals(apellido))){
                cont.setNombre(aux.getNombre());
                cont.setApellidos(aux.getApellidos());
                cont.setTlf(aux.getTlf());
                cont.setDir(aux.getDir());
                cont.setId(aux.getId());
                cont.setNombreMedico(aux.getNombreMedico());
                cont.setSala(aux.getSala());
                control=true;
                return cont;
            }
       }
           return cont;
    }
    
    public Historial aniadirAlHist(String nomb,String apellido, String h){
        boolean control = false;
        int index=0;
        Historial cont = new Historial();
        Iterator i = listaHist.iterator();
        while (i.hasNext() && control == false) {
            Historial aux = (Historial) i.next();
            index=index+1;
            if ((aux.getNomb().equals(nomb)) && (aux.getApe().equals(apellido))) {
                cont.setHist(h+"\n"+aux.getHist());
                cont.setApe(apellido);
                cont.setNomb(nomb);
                control = true;
                index=index-1;
                listaHist.set(index, cont);
                JOptionPane.showMessageDialog(null, "Cambios añadidos al historial", "Historial", JOptionPane.INFORMATION_MESSAGE);
            }
        }
        if (control == false){
                JOptionPane.showMessageDialog(null, "Datos de paciente erróneos", "Receta", JOptionPane.ERROR_MESSAGE);
            }
        return cont;
    }
    
    
    public boolean esta (String nombre, String ape){
        boolean control=false;
        Iterator i = listaPac.iterator();
        while(i.hasNext()&& control==false){
            Paciente aux = (Paciente) i.next();
            if ((aux.getNombre().equals(nombre)) && (aux.getApellidos().equals(ape))){
                
                control=true;
            }
        }
        return control;
    }
    
    
    public Paciente mostrarPac(String iden){
        boolean control=false;
        Iterator i = listaPac.iterator();
        Paciente cont = new Paciente();
        while(i.hasNext()&& control==false){
            Paciente aux = (Paciente) i.next();
            if (aux.getId().equals(iden)){
                cont.setNombre(aux.getNombre());
                cont.setApellidos(aux.getApellidos());
                cont.setTlf(aux.getTlf());
                cont.setDir(aux.getDir());
                cont.setId(aux.getId());
                cont.setNombreMedico(aux.getNombreMedico());
                cont.setSala(aux.getSala());
                control=true;
                return cont;
            }
       }
           return cont;
    }
    
    public void GuardarPac(Paciente a, int ide) {
        boolean control = false;
        Iterator i = listaPac.iterator();
        while (i.hasNext() && control == false) {
            Paciente aux = (Paciente) i.next();
            if (Integer.parseInt(aux.getId())==ide+1) {
                listaPac.set(ide, a);
                control = true;
            }
        }
    }
    public int GuardarCita(Cita a) {
        int bandera=0;
        boolean control = false;
        Iterator i = listaCita.iterator();
        Date fecha = a.getFecha();
        int hora= a.getHora();
        int min=a.getMin();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(fecha);
        int dia = calendar.get(Calendar.DAY_OF_MONTH);
        int mes = calendar.get(Calendar.MONTH);
        int anio = calendar.get(Calendar.YEAR);
        while (i.hasNext() && control == false) {
            Cita aux = (Cita) i.next();
            Calendar calen = Calendar.getInstance();
            calen.setTime(aux.getFecha());
            int dia2 = calen.get(Calendar.DAY_OF_MONTH);
            int mes2 = calen.get(Calendar.MONTH);
            int anio2 = calen.get(Calendar.YEAR);
            if (anio==anio2 && mes==mes2 && dia==dia2 && hora == aux.getHora() && min==aux.getMin()) {
                JOptionPane.showMessageDialog(null, "Hora ocupada", "Cambiar Hora", JOptionPane.INFORMATION_MESSAGE);
                control = true;
            }
        }
        if (control == false) {
            bandera=1;
            listaCita.add(a);
            JOptionPane.showMessageDialog(null, "Cita añadida correctamente", "Cita añadida", JOptionPane.INFORMATION_MESSAGE);
        }
        return bandera;
    }
    public void GuardarCita(int hora, int min, Date fecha, Paciente pac, Medico me) {
        boolean control = false;
        Iterator i = listaCita.iterator();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(fecha);
        int dia = calendar.get(Calendar.DAY_OF_MONTH);
        int mes = calendar.get(Calendar.MONTH);
        int anio = calendar.get(Calendar.YEAR);
        while (i.hasNext() && control == false) {
            Cita aux = (Cita) i.next();
            Calendar calen = Calendar.getInstance();
            calen.setTime(aux.getFecha());
            int dia2 = calen.get(Calendar.DAY_OF_MONTH);
            int mes2 = calen.get(Calendar.MONTH);
            int anio2 = calen.get(Calendar.YEAR);
            if (anio == anio2 && mes == mes2 && dia == dia2 && hora == aux.getHora() && min == aux.getMin()) {
                JOptionPane.showMessageDialog(null, "Hora ocupada", "Cambiar Hora", JOptionPane.INFORMATION_MESSAGE);
                control = true;
            }
        }
        if (control == false) {
            Cita a = new Cita(pac, fecha, me , hora, min);
            listaCita.add(a);
            JOptionPane.showMessageDialog(null, "Cita añadida correctamente", "Cita añadida", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    public void borrarPac(String nomb, String ape) {
        boolean control = false;
        Iterator i = listaPac.iterator();
        while (i.hasNext() && control == false) {
            Paciente aux = (Paciente) i.next();
            if (aux.getNombre().equals(nomb) && aux.getApellidos().equals(ape)) {
                i.remove();
                JOptionPane.showMessageDialog(null, "Ficha paciente borrada correctamente", "Ficha borrada", JOptionPane.INFORMATION_MESSAGE);
                control = true;
            }
        }
        if (control == false) {
            JOptionPane.showMessageDialog(null, "Ficha paciente no borrada", "Ficha no borrada", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    public void borrarPac(String ide) {
        boolean control = false;
        Iterator i = listaPac.iterator();
        while (i.hasNext() && control == false) {
            Paciente aux = (Paciente) i.next();
            if (aux.getId().equals(ide)) {
                i.remove();
                JOptionPane.showMessageDialog(null, "Ficha paciente borrada correctamente", "Ficha borrada", JOptionPane.INFORMATION_MESSAGE);
                control = true;
            }
        }
        if (control == false) {
            JOptionPane.showMessageDialog(null, "Ficha paciente no borrada", "Ficha no borrada", JOptionPane.INFORMATION_MESSAGE);
        }
    }
    
    public String mostrarCitas(Date fecha){
        String todasCitas="";
        Iterator i = listaCita.iterator();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(fecha);
        int dia = calendar.get(Calendar.DAY_OF_MONTH);
        int mes = calendar.get(Calendar.MONTH);
        int anio = calendar.get(Calendar.YEAR);
        while (i.hasNext()) {
            Cita aux = (Cita) i.next();
            Calendar calen = Calendar.getInstance();
            calen.setTime(aux.getFecha());
            int dia2 = calen.get(Calendar.DAY_OF_MONTH);
            int mes2 = calen.get(Calendar.MONTH);
            int anio2 = calen.get(Calendar.YEAR);
            if (anio == anio2 && mes == mes2 && dia == dia2) {
                todasCitas=todasCitas+"Nombre: "+aux.getPac().getNombre()+" "+aux.getPac().getApellidos()+"\n"+
                        "Fecha: "+dia+"/"+(mes+1)+"/"+anio+"\n";

                if(aux.getMin()<10){
                    todasCitas=todasCitas+"Hora: "+aux.getHora()+":"+"0"+aux.getMin()+"\n";
                }else{
                    todasCitas=todasCitas+"Hora: "+aux.getHora()+":"+aux.getMin()+"\n";
                }
                todasCitas=todasCitas+"Medico: "+aux.getPac().getNombreMedico()+" "+"Sala: "+aux.getPac().getSala()+"\n";
                todasCitas=todasCitas+"_________________________"+"\n";
            }
        }
        return todasCitas;
    }

    public String mostrarCitas(Date fecha, String nomb, String apel){
        String todasCitas="";
        Iterator i = listaCita.iterator();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(fecha);
        int dia = calendar.get(Calendar.DAY_OF_MONTH);
        int mes = calendar.get(Calendar.MONTH);
        int anio = calendar.get(Calendar.YEAR);
        while (i.hasNext()) {
            Cita aux = (Cita) i.next();
            Calendar calen = Calendar.getInstance();
            calen.setTime(aux.getFecha());
            int dia2 = calen.get(Calendar.DAY_OF_MONTH);
            int mes2 = calen.get(Calendar.MONTH);
            int anio2 = calen.get(Calendar.YEAR);
            String n = aux.getPac().getNombre();
            String ape = aux.getPac().getApellidos();
            if (anio == anio2 && mes == mes2 && dia == dia2 && nomb.equals(n) && apel.equals(ape)){
                todasCitas=todasCitas+"Nombre: "+aux.getPac().getNombre()+" "+aux.getPac().getApellidos()+"\n"+
                        "Fecha: "+dia+"/"+mes+"/"+anio+"\n";

                if(aux.getMin()<10){
                    todasCitas=todasCitas+"Hora: "+aux.getHora()+":"+"0"+aux.getMin()+"\n";
                        
                }else {
                    todasCitas=todasCitas+"Hora: "+aux.getHora()+":"+aux.getMin()+"\n";
                        
                }
                todasCitas=todasCitas+"Medico: "+aux.getPac().getNombreMedico()+" "+"Sala: "+aux.getPac().getSala()+"\n";
                todasCitas=todasCitas+"_________________________"+"\n";
            }
        }
        return todasCitas;
    }
    
    public String mostCitMed(Date fecha, String nombMed){
        String todasCitas="";
        Iterator i = listaCita.iterator();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(fecha);
        int dia = calendar.get(Calendar.DAY_OF_MONTH);
        int mes = calendar.get(Calendar.MONTH);
        int anio = calendar.get(Calendar.YEAR);
        while (i.hasNext()) {
            Cita aux = (Cita) i.next();
            Calendar calen = Calendar.getInstance();
            calen.setTime(aux.getFecha());
            int dia2 = calen.get(Calendar.DAY_OF_MONTH);
            int mes2 = calen.get(Calendar.MONTH);
            int anio2 = calen.get(Calendar.YEAR);
            String n = aux.getPac().getNombreMedico();
            if (anio == anio2 && mes == mes2 && dia == dia2 && nombMed.equals(n)){
                todasCitas=todasCitas+"Nombre: "+aux.getPac().getNombre()+" "+aux.getPac().getApellidos()+"\n"+
                        "Fecha: "+dia+"/"+mes+"/"+anio+"\n";

                if(aux.getMin()<10){
                    todasCitas=todasCitas+"Hora: "+aux.getHora()+":"+"0"+aux.getMin()+"\n"+
                        "_________________________"+"\n";
                }else{
                    todasCitas=todasCitas+"Hora: "+aux.getHora()+":"+aux.getMin()+"\n"+
                        "_________________________"+"\n";
                }
            }
        }
        return todasCitas;
    }
    
    public String mostHist(String nomb, String ape){
        boolean control= false;
        String h="";
        Iterator i = listaHist.iterator();       
        while(i.hasNext()&& control==false){
            Historial aux = (Historial) i.next();
            if ((aux.getNomb().equals(nomb)) && (aux.getApe().equals(ape))){
                h = (aux.getHist());
                control=true;
            }
        }
        return h;
    }

    public void borrarCitas(String nomb, String ape, Date fecha) {
        boolean control = false;
        Iterator i = listaCita.iterator();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(fecha);
        int dia = calendar.get(Calendar.DAY_OF_MONTH);
        int mes = calendar.get(Calendar.MONTH);
        int anio = calendar.get(Calendar.YEAR);
        while (i.hasNext() && control == false) {
            Cita aux = (Cita) i.next();
            Calendar calen = Calendar.getInstance();
            calen.setTime(aux.getFecha());
            int dia2 = calen.get(Calendar.DAY_OF_MONTH);
            int mes2 = calen.get(Calendar.MONTH);
            int anio2 = calen.get(Calendar.YEAR);
            if (aux.getPac().getNombre().equals(nomb) && aux.getPac().getApellidos().equals(ape) &&anio==anio2 && mes==mes2 && dia==dia2 ) {
                i.remove();
                JOptionPane.showMessageDialog(null, "Citas paciente borradas correctamente", "Citas borrada", JOptionPane.INFORMATION_MESSAGE);
                control = true;
            }
        }
    }
        
    
    public void cargar() {
        try {
            FileInputStream fentrada = null;
            fentrada = new FileInputStream("Clinica.dat");
            ObjectInputStream entrada = null;
            entrada = new ObjectInputStream(fentrada);
            Object aux = null;
            Paciente c = new Paciente();
            while ((aux = entrada.readObject()) != null) {
                if (aux instanceof Paciente) {
                    c = (Paciente) aux;
                    this.anyadir(c);
                }
                else if(aux instanceof Cita){
                    listaCita.add((Cita)aux);
                }
                else if(aux instanceof Historial){
                    listaHist.add((Historial)aux);
                }
            }
            fentrada.close();
            entrada.close();
        } catch (Exception e) {
        }
    }
    public void guardar() {
        try{
        FileOutputStream fsalida=new FileOutputStream("Clinica.dat");
        ObjectOutputStream salida=new ObjectOutputStream(fsalida);
        Iterator i = listaPac.iterator();
         while(i.hasNext()){
            Paciente aux = (Paciente) i.next();
            salida.writeObject(aux);
       }
         i = listaCita.iterator();
         while(i.hasNext()){
            Cita aux = (Cita) i.next();
            salida.writeObject(aux);
       }
         i = listaMed.iterator();
         while(i.hasNext()){
            Medico aux = (Medico) i.next();
            salida.writeObject(aux);
       }
         i = listaHist.iterator();
         while(i.hasNext()){
            Historial aux = (Historial) i.next();
            salida.writeObject(aux);
       }
         
        salida.close();
        fsalida.close();
        }catch (Exception e)
        {
            System.out.println ("guardado sin exito.");
        }
    }
}
